package com.entrogy.utils;

import com.alibaba.fastjson.JSONObject;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * xlr
 */
public class TimeUtils {
    private SimpleDateFormat sfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private SimpleDateFormat sfDate = new SimpleDateFormat("yyyy-MM-dd");
    private SimpleDateFormat sfTime = new SimpleDateFormat("HH:mm:ss");

    //检测是否是节假日的api接口
    private static String checkHolidayUrl = "http://api.goseek.cn/Tools/holiday?date=";

    // 获取当前的年月日时分秒
    public  String getCurrentDateTime() {
        Date curDate = new Date();
        return sfDateTime.format(curDate);
    }

    // 获取当前的年月日时分秒
    public String getDateTime(Date date) {
        return sfDateTime.format(date);
    }

    // 获取当前的年月日
    public String getCurrentDate() {
        Date curDate = new Date();
        return sfDate.format(curDate);
    }

    // 获得给定时间是周几
    public int getWeekNum(String date) throws ParseException {
        Calendar cal = Calendar.getInstance();
        Date theDate = sfDate.parse(date);
        cal.setTime(theDate);
        // 1是星期日、2是星期一、3是星期二、4是星期三、5是星期四、6是星期五、7是星期六
        int n = cal.get(Calendar.DAY_OF_WEEK);
        // 更符合逻辑
        return n == 1 ? 7 : n - 1;
    }

    // 根据时分秒获得时间
    public Date getHourMinuteDate(int hour, int minute, int second) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        return calendar.getTime();
    }

    // 增加或减少天数
    public Date addDay(Date date, int day, int hour, int minute) {
        Calendar startDT = Calendar.getInstance();
        startDT.setTime(date);
        startDT.add(Calendar.DAY_OF_MONTH, day);
        startDT.add(Calendar.HOUR_OF_DAY, hour);
        startDT.add(Calendar.MINUTE, minute);
        return startDT.getTime();
    }

    // 定时任务的开始时间
    public Date getStartDate(int hour, int minute, int second) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        Date date = calendar.getTime(); // 第一次执行定时任务的时间
        // 如果第一次执行定时任务的时间 小于 当前的时间，此时要在 第一次执行定时任务的时间 加一天，以便此任务在下个时间点执行。如果不加一天，任务会立即执行。
        if (date.before(new Date())) {
            date = this.addDay(date, 1, 0, 0);
        }
        return date;
    }

    // 已知时分秒转成string
    public String getStringTime(int hour, int minute, int second) {
        Date date = getHourMinuteDate(hour, minute, second);
        return sfTime.format(date);
    }

    public static Integer isHoliday(Date currentTime){
        //节假日类型
        /*
        1、接口地址：http://api.goseek.cn/Tools/holiday?date=数字日期，支持https协议。
        2、返回数据：正常工作日对应结果为 0, 法定节假日对应结果为 1, 节假日调休补班对应的结果为 2，休息日对应结果为 3
        3、节假日数据说明：本接口包含2017年起的中国法定节假日数据，数据来源国务院发布的公告，每年更新1次，确保数据最新
        4、示例：
        http://api.goseek.cn/Tools/holiday?date=20170528
        返回示例：
        {
            "code": 10000,
            "data": 1
        }
        */
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        String currentTimeStr = simpleDateFormat.format(currentTime);
        String jsonResult = "";
        try{
            //接口可能会调用失败
            jsonResult = HttpUtils.doGet(checkHolidayUrl + currentTimeStr);
        }catch (Exception e){
            e.printStackTrace();
        }
        if (!StrUtils.isNullOrEmpty(jsonResult)){
            JSONObject jsonObject = JSONObject.parseObject(jsonResult);
            return jsonObject.getInteger("data");
        }
        return null;
    }

//    public static void main(String[] args) {
//        System.out.println("调用结果：" + isHoliday(new Date()));
//    }
}
